/**
 * @author Aaron
 * @createTime 10:39 2022/6/1
 **/
package services

// import (
// 	"errors"
// 	"fmt"
// 	"timehelper"

// 	"github.com/jinzhu/copier"
// 	"github.com/labstack/echo/v4"
// 	"longmen/server/pkg/common/api_models"
// 	"longmen/server/cache"
// 	"longmen/server/common"
// 	"longmen/server/global"
// 	"longmen/server/pkg/db/mysql/models"
// 	"longmen/server/pkg/common/repository"
// 	"longmen/server/util"
// )

// func (s *Service) GetMyNoble(uid int) (*api_models.GetNobleByIdResp, error) {
// 	record, err := repository.GetNobleRecordByUid(uid)
// 	if err != nil {
// 		return nil, err
// 	}
// 	resp := &api_models.GetNobleByIdResp{}
// 	if record.Id > 0 {
// 		resp.Expiration = int64(util.GetLeftDays(record.Expiration))
// 		nobleInfo, err := cache.GetNoble(uint8(record.NobleId))

// 		if err != nil {
// 			return resp, err
// 		}
// 		err = copier.Copy(resp, nobleInfo)
// 		if err != nil {
// 			return nil, err
// 		}
// 	}
// 	return resp, nil
// }

// func (s *Service) GetNobleById(id uint8) (*api_models.GetNobleByIdResp, error) {
// 	nobleInfo, err := cache.GetNoble(id)
// 	if err != nil {
// 		return nil, err
// 	}
// 	resp := &api_models.GetNobleByIdResp{}
// 	resp.Expiration = 0
// 	err = copier.Copy(resp, nobleInfo)
// 	if err != nil {
// 		return nil, err
// 	}
// 	resp.RenewReward = resp.RenewReward * float32(resp.RenewPrice)
// 	return resp, nil
// }

// func (s *Service) GetNobleNameList() ([]*api_models.GetNobleListResp, error) {
// 	fName := "GetNobleNameList"
// 	nobleList, err := repository.GetNobleNameList()
// 	if err != nil {
// 		err = fmt.Errorf("%s%s", common.Convert(fName), err.Error())
// 	}
// 	return nobleList, nil
// }

// func (s *Service) ChargeNoble(id uint8, uid, anchorId uint) error {
// 	var userBackpack []*models.UserBackpack
// 	var flag bool
// 	nr := &models.NobleRecord{
// 		NobleId:    id,
// 		Uid:        uid,
// 		Expiration: timehelper.Now().AddDate(0, 1, 0).Unix(),
// 	}
// 	//直播间充值给主播分成
// 	anchor, err := repository.GetUserParam(echo.Map{"id": anchorId, "is_anchor": 1})
// 	if err != nil {
// 		return err
// 	}
// 	if anchor.Id > 0 {
// 		nr.ReceiveUid = uint(anchor.Id)
// 	}
// 	//获取充值贵族记录
// 	nobleRecord, err := repository.GetNobleRecord(uid)
// 	if err != nil {
// 		return err
// 	}
// 	reward, err := repository.GetNobleById(id)
// 	if err != nil {
// 		return err
// 	}
// 	//发放挂件
// 	propList, err := repository.GetPropListByNobleId(id)
// 	for _, prop := range propList {
// 		userBackpack = append(userBackpack, &models.UserBackpack{
// 			Type:    2,
// 			Uid:     int(uid),
// 			Gid:     int(prop.PropId),
// 			ExpTime: timehelper.Now().AddDate(0, 1, 0).Unix(),
// 		})
// 	}
// 	//发放礼物
// 	userBackpack = append(userBackpack, &models.UserBackpack{
// 		Type: 1,
// 		Uid:  int(uid),
// 		Gid:  int(reward.GiftId),
// 	})
// 	//发放钻石
// 	decimal, err := repository.GetNobleRewardById(id)
// 	if err != nil {
// 		return err
// 	}
// 	if decimal != nil {
// 		flag = true
// 	}
// 	tx := global.GetX().Begin()
// 	defer func() {
// 		if r := recover(); r != nil {
// 			tx.Rollback()
// 		}
// 	}()
// 	if nobleRecord.NobleId > 0 {
// 		if nobleRecord.NobleId == id {
// 			//续费
// 			user, err := repository.GetUserParam(echo.Map{"id": uid})
// 			if err != nil {
// 				tx.Rollback()
// 				return err
// 			}
// 			if flag {
// 				user.Diamond += int(decimal.RenewReward * reward.RenewPrice)
// 				err = repository.UpdateUserByTransactions(tx, []string{"diamond"}, user)
// 				if err != nil {
// 					return err
// 				}
// 			}
// 			nobleRecord.Expiration = util.Stamp2Time(nobleRecord.Expiration).AddDate(0, 1, 0).Unix()
// 			err = repository.UpdateNobleRecordByTx(tx, nobleRecord)
// 			if err != nil {
// 				return err
// 			}
// 		} else if nobleRecord.NobleId < id {
// 			//升级
// 			user, err := repository.GetUserParam(echo.Map{"id": uid})
// 			if err != nil {
// 				tx.Rollback()
// 				return err
// 			}
// 			if flag {
// 				user.Diamond += int(decimal.Reward)
// 				err = repository.UpdateUserByTransactions(tx, []string{"diamond"}, user)
// 				if err != nil {
// 					return err
// 				}
// 			}
// 			nobleRecord.Expiration = timehelper.Now().AddDate(0, 1, 0).Unix()
// 			nobleRecord.NobleId = id
// 			err = repository.UpdateNobleRecordByTx(tx, nobleRecord)
// 			if err != nil {
// 				return err
// 			}
// 			err = repository.UpdateUserBackpack(user.Id)
// 			if err != nil {
// 				tx.Rollback()
// 				return err
// 			}
// 		} else if nobleRecord.NobleId > id {
// 			tx.Rollback()
// 			return errors.New("请等待当前贵族过期后再充值")
// 		}

// 	} else {
// 		//首充
// 		err = repository.InsertNobleRecordByTx(tx, nr)
// 		if err != nil {
// 			return err
// 		}
// 		user, err := repository.GetUserParam(echo.Map{"id": uid})
// 		if err != nil {
// 			tx.Rollback()
// 			return err
// 		}
// 		if flag {
// 			user.Diamond += int(decimal.Reward)
// 			err = repository.UpdateUserByTransactions(tx, []string{"diamond"}, user)
// 			if err != nil {
// 				return err
// 			}
// 		}
// 	}
// 	if len(userBackpack) > 0 {
// 		err := repository.InsertUserBackpackBatchesData(tx, userBackpack) //带roll back
// 		if err != nil {
// 			return err
// 		}
// 	}
// 	if err := tx.Commit().Error; err != nil {
// 		return err
// 	}
// 	cache.DelUserInfoCache(int(uid))
// 	return nil
// }

// func (s *Service) UpgradeNoble(id uint8, uid, anchorId uint) error {
// 	var userBackpack []*models.UserBackpack
// 	var flag bool
// 	nr := &models.NobleRecord{
// 		NobleId:    id,
// 		Uid:        uid,
// 		Expiration: timehelper.Now().AddDate(0, 1, 0).Unix(),
// 	}
// 	//直播间充值给主播分成
// 	anchor, err := repository.GetUserParam(echo.Map{"id": anchorId, "is_anchor": 1})
// 	if err != nil {
// 		return err
// 	}
// 	if anchor.Id > 0 {
// 		nr.ReceiveUid = uint(anchor.Id)
// 	}
// 	//获取充值贵族记录
// 	nobleRecord, err := repository.GetNobleRecord(uid)
// 	if err != nil {
// 		return err
// 	}
// 	reward, err := repository.GetNobleById(id)
// 	if err != nil {
// 		return err
// 	}
// 	//发放挂件
// 	propList, err := repository.GetPropListByNobleId(id)
// 	for _, prop := range propList {
// 		userBackpack = append(userBackpack, &models.UserBackpack{
// 			Type:    2,
// 			Uid:     int(uid),
// 			Gid:     int(prop.PropId),
// 			ExpTime: timehelper.Now().AddDate(0, 1, 0).Unix(),
// 		})
// 	}
// 	//发放礼物
// 	userBackpack = append(userBackpack, &models.UserBackpack{
// 		Type: 1,
// 		Uid:  int(uid),
// 		Gid:  int(reward.GiftId),
// 	})
// 	//发放钻石
// 	decimal, err := repository.GetNobleRewardById(id)
// 	if err != nil {
// 		return err
// 	}
// 	if decimal != nil {
// 		flag = true
// 	}
// 	tx := global.GetX().Begin()
// 	defer func() {
// 		if r := recover(); r != nil {
// 			tx.Rollback()
// 		}
// 	}()
// 	if nobleRecord.NobleId > 0 {
// 		if nobleRecord.NobleId == id {
// 			//续费
// 			user, err := repository.GetUserParam(echo.Map{"id": uid})
// 			if err != nil {
// 				tx.Rollback()
// 				return err
// 			}
// 			if flag {
// 				user.Diamond += int(decimal.RenewReward * reward.RenewPrice)
// 				err = repository.UpdateUserByTransactions(tx, []string{"diamond"}, user)
// 				if err != nil {
// 					return err
// 				}
// 			}
// 			nobleRecord.Expiration = util.Stamp2Time(nobleRecord.Expiration).AddDate(0, 1, 0).Unix()
// 			err = repository.UpdateNobleRecordByTx(tx, nobleRecord)
// 			if err != nil {
// 				return err
// 			}
// 		} else if nobleRecord.NobleId < id {
// 			//升级
// 			user, err := repository.GetUserParam(echo.Map{"id": uid})
// 			if err != nil {
// 				tx.Rollback()
// 				return err
// 			}
// 			if flag {
// 				user.Diamond += int(decimal.Reward)
// 				err = repository.UpdateUserByTransactions(tx, []string{"diamond"}, user)
// 				if err != nil {
// 					return err
// 				}
// 			}
// 			nobleRecord.Expiration = timehelper.Now().AddDate(0, 1, 0).Unix()
// 			nobleRecord.NobleId = id
// 			err = repository.UpdateNobleRecordByTx(tx, nobleRecord)
// 			if err != nil {
// 				return err
// 			}
// 			err = repository.UpdateUserBackpack(user.Id)
// 			if err != nil {
// 				tx.Rollback()
// 				return err
// 			}
// 		} else if nobleRecord.NobleId > id {
// 			tx.Rollback()
// 			return errors.New("请等待当前贵族过期后再充值")
// 		}

// 	} else {
// 		//首充
// 		err = repository.InsertNobleRecordByTx(tx, nr)
// 		if err != nil {
// 			return err
// 		}
// 		user, err := repository.GetUserParam(echo.Map{"id": uid})
// 		if err != nil {
// 			tx.Rollback()
// 			return err
// 		}
// 		if flag {
// 			user.Diamond += int(decimal.Reward)
// 			err = repository.UpdateUserByTransactions(tx, []string{"diamond"}, user)
// 			if err != nil {
// 				return err
// 			}
// 		}
// 	}
// 	if len(userBackpack) > 0 {
// 		err := repository.InsertUserBackpackBatchesData(tx, userBackpack) //带roll back
// 		if err != nil {
// 			return err
// 		}
// 	}
// 	if err := tx.Commit().Error; err != nil {
// 		return err
// 	}
// 	cache.DelUserInfoCache(int(uid))
// 	return nil
// }

// func (s *Service) ReceiveNoble(user *models.User) (*api_models.ReceiveNobleResp, error) {
// 	var (
// 		err          error
// 		vipLen       = 0
// 		fName        = "ReceiveNoble"
// 		vipDays      = 5 //领取的VIP有效期5天
// 		expTime      = timehelper.Now().AddDate(0, 0, vipDays).Unix()
// 		nobleRecord  *models.NobleRecord
// 		nobleList    []*models.Noble
// 		userBackpack []*models.UserBackpack
// 		profitLog    []*models.UserProfit
// 	)

// 	// 0.如果用户已经是VIP，且未到期不能领取
// 	if nobleRecord, err = repository.GetNobleRecordPrice(uint(user.Id)); err != nil {
// 		return nil, fmt.Errorf("%s %s", common.Convert(fName), err.Error())
// 	}
// 	if nobleRecord.Id > 0 && util.GetTimeStamp(1) < nobleRecord.Expiration {
// 		return nil, errors.New("您已是尊贵的VIP")
// 	}

// 	// 1.获取等级列表
// 	nobleList, err = repository.GetNobleList() // TODO 加缓存
// 	if vipLen = len(nobleList); err != nil {
// 		return nil, fmt.Errorf("%s %s", common.Convert(fName), err.Error())
// 	}
// 	if vipLen == 0 {
// 		return nil, errors.New("系统未配置VIP等级")
// 	}

// 	// 2.随机取一个VIP
// 	idx := util.RandInt(0, vipLen)
// 	noble := nobleList[idx]
// 	noblePrivilege, err := repository.GetNoblePrivilege(noble.Id)
// 	if err != nil {
// 		return nil, errors.New("系统未配置VIP等级信息")
// 	}

// 	// 3.发放挂件
// 	propList, err := repository.GetPropListByNobleId(noble.Id)
// 	for _, prop := range propList {
// 		userBackpack = append(userBackpack, &models.UserBackpack{
// 			Type:    2,
// 			Uid:     user.Id,
// 			Gid:     int(prop.PropId),
// 			ExpTime: timehelper.Now().AddDate(0, 1, 0).Unix(),
// 		})
// 	}

// 	// 4.发放礼物
// 	userBackpack = append(userBackpack, &models.UserBackpack{
// 		Type: 1,
// 		Uid:  user.Id,
// 		Gid:  int(noble.GiftId),
// 	})

// 	// 5.发放钻石
// 	decimal, err := repository.GetNobleRewardById(noble.Id) // 开通的奖励，这里领取算开通
// 	if err != nil {
// 		return nil, errors.New("发放钻石失败")
// 	}

// 	tx := global.GetX().Begin()
// 	defer func() {
// 		if r := recover(); r != nil {
// 			tx.Rollback()
// 		}
// 	}()

// 	// 4.写入一条等级关联记录
// 	if err = repository.InsertNobleRecordByTx(tx, &models.NobleRecord{
// 		NobleId:    noble.Id,      //贵族ID
// 		Uid:        uint(user.Id), //用户ID
// 		Expiration: expTime,       //到期时间戳
// 		ReceiveUid:   0,
// 		CreateTime: util.GetTimeStamp(1),
// 	}); err != nil {
// 		return nil, fmt.Errorf("%s %s", common.Convert(fName), err.Error())
// 	}

// 	// 5.更新当前用户的领取状态、钻石数量
// 	user.ReceiveVip = 1
// 	if decimal != nil && decimal.Reward > 0 {
// 		user.Diamond += int(decimal.Reward)
// 	}
// 	if err = repository.UpdateUserByTransactions(tx, []string{"receive_vip", "diamond"}, user); err != nil {
// 		return nil, fmt.Errorf("%s %s", common.Convert(fName), err.Error())
// 	}

// 	// 6.更新礼物、挂件
// 	if len(userBackpack) > 0 {
// 		if err = repository.InsertUserBackpackBatchesData(tx, userBackpack); err != nil {
// 			return nil, fmt.Errorf("%s %s", common.Convert(fName), err.Error())
// 		}
// 	}

// 	if decimal.Reward > 0 {
// 		// 7.写入账变记录
// 		profitLog = []*models.UserProfit{
// 			{
// 				Uid:         user.Id,             //获得人的id, 这里是领取人
// 				CoinCount:   int(decimal.Reward), //鹰钻或金坷拉数量
// 				FUid:        0,                   //赠送人的ID, 系统赠送
// 				ConsumeType: util.PROFIT_RECEIVE_NOBLE,
// 				Type:        util.TYPE_PROFIT, //赚钱记录
// 				Content: fmt.Sprintf("%s 领取VIP %s(%d天)，获得收益:%d克拉",
// 					user.NickName,
// 					noble.Name, vipDays,
// 					decimal.Reward/100, //注意这里要除以100
// 				),
// 				Resid:      0,
// 				Count:      0,
// 				CreateTime: timehelper.Now(),
// 				CoinType:   int(util.CoinDiamond), //1-鹰钻 2-金坷拉
// 				OrderNo:    util.GenOrderId("RV", 1),
// 				Liveid:     0,
// 			},
// 		}
// 		global.Log.Debugf("%s写收益记录来源方:%v", fName, profitLog)

// 		if err = repository.InsertUserProfitByTransactions(tx, profitLog); err != nil {
// 			global.Log.Error("%s领取VIP获取收益记录写入失败:%v", fName, profitLog)
// 		}

// 		// 8.写入消息通知
// 		if err = repository.InsertNoticeByTx(tx, &models.Notice{
// 			SenderUid:  uint(user.Id),
// 			Content: fmt.Sprintf("恭喜您领取VIP %s：开盲盒，奖励如下：钻石x%d", noble.Name, decimal.Reward/100),
// 		}); err != nil {
// 			return nil, fmt.Errorf("%s %s", common.Convert(fName), err.Error())
// 		}
// 	}

// 	if err = tx.Commit().Error; err != nil {
// 		tx.Rollback()
// 		return nil, err
// 	}

// 	if err = cache.DelUserInfoCache(user.Id); err != nil {
// 		global.Log.Error("%s清楚用户缓存数据失败:%v", fName, err)
// 	}

// 	return &api_models.ReceiveNobleResp{
// 		VipDay:  uint8(vipDays),
// 		VipName: noblePrivilege.MountTitle, //noble.Name
// 		RankId:  noble.RankID,
// 		//NobleTitle: noblePrivilege.MountTitle,
// 	}, nil
// }

// func (s *Service) GetNoblePriceList(uid uint) ([]*api_models.GetNoblePrice, error) {
// 	nobleRecord, err := repository.GetNobleRecordPrice(uid) //查询是否是贵族
// 	if err != nil {
// 		return nil, err
// 	}
// 	prices := make([]*api_models.GetNoblePrice, 0)
// 	priceList, err := repository.GetNoblePriceList()
// 	if err != nil {
// 		return nil, err
// 	}
// 	for _, price := range priceList {
// 		if price.Id == nobleRecord.NobleId {
// 			price.IsRenew = true
// 			price.Price = price.RenewPrice
// 		}
// 	}
// 	err = copier.Copy(&prices, &priceList)
// 	if err != nil {
// 		return nil, fmt.Errorf("%s%s", common.Convert2(), err.Error())
// 	}
// 	return prices, nil
// }
